home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / network / ka9q / ka9q_src.arc / CMDPARSE.C < prev    next >
C/C++ Source or Header  |  1988-07-28  |  3KB  |  127 lines

  1. /* Parse command line, set up command arguments Unix-style, and call function.
  2.  * Note: argument is modified (delimiters are overwritten with nulls)
  3.  * Improved error handling by Brian Boesch of Stanford University
  4.  */
  5. #include <stdio.h>
  6. #include "global.h"
  7. #include "cmdparse.h"
  8.  
  9. int
  10. cmdparse(cmds,line)
  11. struct cmds cmds[];
  12. register char *line;
  13. {
  14.     struct cmds *cmdp;
  15.     char *argv[NARG],*cp;
  16.     int argc,qflag;
  17.     int rslt;
  18.  
  19.     /* Remove cr/lf */
  20.     rip(line);
  21.  
  22.     for(argc = 0;argc < NARG;argc++)
  23.         argv[argc] = NULLCHAR;
  24.  
  25.     for(argc = 0;argc < NARG;){
  26.         qflag = 0;
  27.         /* Skip leading white space */
  28.         while(*line == ' ' || *line == '\t')
  29.             line++;
  30.         if(*line == '\0')
  31.             break;
  32.         /* Check for quoted token */
  33.         if(*line == '"'){
  34.             line++;    /* Suppress quote */
  35.             qflag = 1;
  36.         }
  37.         argv[argc++] = line;    /* Beginning of token */
  38.         /* Find terminating delimiter */
  39.         if(qflag){
  40.             /* Find quote, it must be present */
  41.             if((line = index(line,'"')) == NULLCHAR){
  42.                 return -1;
  43.             }
  44.             *line++ = '\0';
  45.         } else {
  46.             /* Find space or tab. If not present,
  47.              * then we've already found the last
  48.              * token.
  49.              */
  50.             if((cp = index(line,' ')) == NULLCHAR
  51.              && (cp = index(line,'\t')) == NULLCHAR){
  52.                 break;
  53.             }
  54.             *cp++ = '\0';
  55.             line = cp;
  56.         }
  57.     }
  58.     if (argc < 1) {        /* empty command line */
  59.         argc = 1;
  60.         argv[0] = "";
  61.     }
  62.     /* Lines beginning with "#" are comments */
  63.     if(argv[0] == NULLCHAR || argv[0][0] == '#')
  64.         return 0;
  65.  
  66.     /* Look up command in table; prefix matches are OK */
  67.     for(cmdp = cmds;cmdp->name != NULLCHAR;cmdp++){
  68.         if(strncmp(argv[0],cmdp->name,strlen(argv[0])) == 0)
  69.             break;
  70.     }
  71.     if(cmdp->name == NULLCHAR) {
  72.         if(cmdp->argc_errmsg != NULLCHAR) 
  73.             printf("%s\n",cmdp->argc_errmsg);
  74.         return -1;
  75.     } else {
  76.         if(argc < cmdp->argcmin) {
  77.             /* Insufficient arguments */
  78.             printf("Usage: %s\n",cmdp->argc_errmsg);
  79.             return -1;
  80.         } else {
  81.             rslt = (*cmdp->func)(argc,argv);
  82.             if ((rslt < 0) && (cmdp->exec_errmsg != NULLCHAR))
  83.                 printf("%s\n",cmdp->exec_errmsg);
  84.             return(rslt);
  85.         }
  86.     }
  87. }
  88.  
  89. /* Call a subcommand based on the first token in an already-parsed line */
  90. int
  91. subcmd(tab,argc,argv)
  92. struct cmds tab[];
  93. int argc;
  94. char *argv[];
  95. {
  96.     int rslt;
  97.     register struct cmds *cmdp;
  98.  
  99.     /* Strip off first token and pass rest of line to subcommand */
  100.     if (argc < 2) {
  101.         if (argc < 1)
  102.             printf("SUBCMD - Don't know what to do?\n");
  103.         else
  104.             printf("\"%s\" - takes at least one argument\n",argv[0]);
  105.         return -1;
  106.     }
  107.     argc--;
  108.     argv++;
  109.     for(cmdp = tab;cmdp->name != NULLCHAR;cmdp++){
  110.         if(strncmp(argv[0],cmdp->name,strlen(argv[0])) == 0){
  111.             if(argc < cmdp->argcmin) {
  112.                 if (cmdp->argc_errmsg != NULLCHAR)
  113.                     printf("Usage: %s\n",cmdp->argc_errmsg);
  114.                 return -1;
  115.             } else {
  116.                 rslt = (*cmdp->func)(argc,argv);
  117.                 if ((rslt < 0) && (cmdp->exec_errmsg != NULLCHAR))
  118.                     printf("%s\n",cmdp->exec_errmsg);
  119.                 return(rslt);
  120.             }
  121.         }
  122.     }
  123.     if (cmdp->argc_errmsg != NULLCHAR) 
  124.         printf("%s\n",cmdp->argc_errmsg);
  125.     return -1;
  126. }
  127.